home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 August: Technology Seed / ADC Seed CD - August 1999.toast / Carbon SDK 1.0d10c3 / Sample Code / AppearanceSample / MegaDialog.cp < prev    next >
Encoding:
Text File  |  1999-05-01  |  5.7 KB  |  231 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        MegaDialog.cp
  3.  
  4.     Contains:    Code to drive our MegaDialog example.
  5.  
  6.     Version:    Appearance 1.0 SDK
  7.  
  8.     Copyright:    © 1997, 1999 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     File Ownership:
  11.  
  12.         DRI:                Edward Voas
  13.  
  14.         Other Contact:        7 of 9, Borg Collective
  15.  
  16.         Technology:            OS Technologies Group
  17.  
  18.     Writers:
  19.  
  20.         (jss)    Jeff Shulman
  21.         (edv)    Ed Voas
  22.  
  23.     Change History (most recent first):
  24.     $Log: MegaDialog.cp,v $
  25.     Revision 1.7  1999/04/29 20:52:27  voas
  26.     use HELP_TAGS_ENABLED
  27.     
  28.     Revision 1.6  1999/04/23 23:25:58  voas
  29.     [2296424] Use timers to control progress bar/caret blinking instead of
  30.     relying on WNE timeouts.
  31.     
  32.     Revision 1.5  1999/04/15 00:39:23  mattack
  33.     guyf edited the sources so they'd build on 8 and X while menu stuff was
  34.     in flux.
  35.     
  36.  
  37.        <1.4>      4/7/99    jss        Add help tag stuff
  38.          <1>     9/11/97    edv        First checked in.
  39. */
  40.  
  41. #include "AppearanceSamplePrefix.h"
  42.  
  43. #include <Appearance.h>
  44. #include "MegaDialog.h"
  45. #include "ProgressPane.h"
  46. #include "SliderPane.h"
  47. #include "ClassicPane.h"
  48. #include "TextPane.h"
  49. #include "LayoutPane.h"
  50. #include "NewButtonPane.h"
  51.  
  52. enum
  53. {
  54.     kNoPane            = 0,
  55.     kClassicPane    = 1,
  56.     kSliderPane        = 2,
  57.     kTextPane         = 3,
  58.     kProgressPane    = 4,
  59.     kLayoutPane        = 5,
  60.     kNewPane        = 6
  61. };
  62.  
  63. MegaDialog::MegaDialog() : BaseDialog( 6000 )
  64. {
  65.     ControlHandle        control;
  66.  
  67. #if HELP_TAGS_ENABLED    
  68.     // Set help for the tab control
  69.     fHelpContentProviderUPP = NewHMControlContentUPP( HelpContentProvider );
  70.     
  71.     ::GetDialogItemAsControl( fDialog, 1, &control );
  72.     ::HMInstallControlContentCallback( control, fHelpContentProviderUPP );
  73.     
  74.     // Set help for the dialog itself
  75.     {
  76.         HMHelpContentRec    windowHelpContent;
  77.         
  78.         windowHelpContent.version = kMacHelpVersion;
  79.         ::GetWindowBounds( GetDialogWindow( fDialog ), kWindowContentRgn, &windowHelpContent.absHotRect );
  80.         windowHelpContent.tagSide = kHMDefaultSide;
  81.  
  82.         // Our minimum content is on a STR resource
  83.         windowHelpContent.content[ kHMMinimumContentIndex ].contentType = kHMStrResContent;
  84.         windowHelpContent.content[ kHMMinimumContentIndex ].u.tagStrRes = 6000;
  85.  
  86.         // No maximum content
  87.         windowHelpContent.content[ kHMMaximumContentIndex ].contentType = kHMNoContent;
  88.         
  89.         ::HMSetWindowHelpContent( GetDialogWindow( fDialog ), &windowHelpContent );
  90.     }
  91. #endif    
  92.     
  93.     fPane = nil;
  94.     SwitchPane( kClassicPane );
  95. }
  96.  
  97. MegaDialog::~MegaDialog()
  98. {
  99.     delete fPane;
  100. }
  101.  
  102. void
  103. MegaDialog::SwitchPane( SInt16 paneIndex )
  104. {
  105.     ControlHandle        control;
  106.  
  107.     if ( paneIndex == 0 ) return;
  108.  
  109.     delete fPane;
  110.     fPane = nil;    
  111.         
  112.     GetDialogItemAsControl( fDialog, 1, &control );
  113.     SetControlValue( control, paneIndex );
  114.  
  115.     switch ( paneIndex )
  116.     {
  117.         case kProgressPane:
  118.             fPane = new ProgressPane( fDialog, CountDITL( fDialog ) );
  119.             break;
  120.  
  121.         case kSliderPane:
  122.             fPane = new SliderPane( fDialog, CountDITL( fDialog ) );
  123.             break;
  124.  
  125.         case kClassicPane:
  126.             fPane = new ClassicPane( fDialog, CountDITL( fDialog ) );
  127.             break;
  128.  
  129.         case kTextPane:
  130.             fPane = new TextPane( fDialog, CountDITL( fDialog ) );
  131.             break;
  132.         
  133.         case kLayoutPane:
  134.             fPane = new LayoutPane( fDialog, CountDITL( fDialog ) );
  135.             break;
  136.         
  137.         case kNewPane:
  138.             fPane = new NewButtonPane( fDialog, CountDITL( fDialog ) );
  139.             break;
  140.     }
  141. }
  142.  
  143. void
  144. MegaDialog::HandleItemHit( SInt16 item )
  145. {
  146.     if ( item == 1 )
  147.     {
  148.         ControlHandle        control;
  149.         
  150.         GetDialogItemAsControl( fDialog, 1, &control );
  151.         SwitchPane( GetControlValue( control ) );
  152.     }
  153.     else if ( fPane )
  154.     {
  155.         fPane->ItemHit( item );
  156.     }
  157. }
  158.  
  159. pascal OSStatus
  160. MegaDialog::HelpContentProvider(ControlRef inControl, Point inGlobalMouse, HMContentRequest inRequest, HMContentProvidedType *outContentProvided, HMHelpContentPtr ioHelpContent)
  161. {
  162.     ControlGetRegionRec    getRegionRec;
  163.     Point                localMouse;
  164.     GrafPtr                currPort;
  165.     
  166.     // Only care if asked to supplu content, we don't have anything special to dispose of
  167.     if ( inRequest != kHMSupplyContent )
  168.         return noErr;
  169.         
  170.     // Get a region for the tabs
  171.     getRegionRec.region = ::NewRgn();
  172.     if ( getRegionRec.region == NULL )
  173.         return ::MemError();
  174.     
  175.     // Convert the global mouse to dialog relative
  176.     ::GetPort( &currPort );
  177.     ::SetPortWindowPort( GetControlOwner( inControl ) );
  178.     
  179.     localMouse = inGlobalMouse;
  180.     ::GlobalToLocal( &localMouse );
  181.     
  182.     // Assume we have no content
  183.     *outContentProvided = kHMContentNotProvided;
  184.  
  185.     // See if we are in any tab
  186.     for ( SInt16 tabIndex = GetControlMinimum( inControl ); tabIndex <= GetControlMaximum( inControl ); tabIndex++ )
  187.     {
  188.         getRegionRec.part = tabIndex;
  189.         
  190.         if ( ( SendControlMessage( inControl, kControlMsgGetRegion, (SInt32) &getRegionRec ) == noErr ) &&
  191.              PtInRgn( localMouse, getRegionRec.region ) )
  192.         {
  193.             // We found the tab, supply the content
  194.             
  195.             // First set the *global* hot rect
  196.             ::GetRegionBounds( getRegionRec.region, &(ioHelpContent->absHotRect) );
  197.             ::LocalToGlobal( &topLeft(ioHelpContent->absHotRect) );
  198.             ::LocalToGlobal( &botRight(ioHelpContent->absHotRect) );
  199.             
  200.             ioHelpContent->tagSide = kHMDefaultSide;
  201.             
  202.             // Our minimum content is on a STR# resource
  203.             ioHelpContent->content[ kHMMinimumContentIndex ].contentType = kHMStringResContent;
  204.             ioHelpContent->content[ kHMMinimumContentIndex ].u.tagStringRes.hmmResID = 6000;
  205.             ioHelpContent->content[ kHMMinimumContentIndex ].u.tagStringRes.hmmIndex = tabIndex;
  206.             
  207.             // No maximum content
  208.             ioHelpContent->content[ kHMMaximumContentIndex ].contentType = kHMNoContent;
  209.             
  210.             *outContentProvided = kHMContentProvided;
  211.             break;
  212.         }
  213.     }
  214.     
  215.     // If in the content of the tab control then don't propagate to the window
  216.     if ( *outContentProvided == kHMContentNotProvided )
  217.     {
  218.         getRegionRec.part = kControlContentMetaPart;
  219.  
  220.         if ( ( SendControlMessage( inControl, kControlMsgGetRegion, (SInt32) &getRegionRec ) == noErr ) &&
  221.              PtInRgn( localMouse, getRegionRec.region ) )
  222.             *outContentProvided = kHMContentNotProvidedDontPropagate;
  223.     }
  224.  
  225.     
  226.     ::DisposeRgn( getRegionRec.region );
  227.     ::MacSetPort( currPort );
  228.     
  229.     return noErr;
  230. }
  231.